๋ฌธ์ ์๊ฐ
๋ฌธ์ ๋งํฌ : https://boj.kr/4112
Tier : Platinum I
Tag : DP, Bitmasking, Bitfield DP
2x2 ๋ธ๋ก, ํ์ ๊ฐ๋ฅํ ใฑ์ ๋ธ๋ก์ ์ด์ฉํ์ฌ N * M ํฌ๊ธฐ์ ์นธ์ ๋ชจ๋ ์ฑ์ฐ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค.
ํ์ด
1. ๋ธ๋ฃจํธ ํฌ์ค ํ์ด๋ฅผ ๋จผ์ ์๊ฐํด๋ณด๊ธฐ
๋จผ์ ๋ธ๋ฃจํธ ํฌ์ค๋ก ํธ๋ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ด ์๋ค.
๋ฌธ์ ์ ๋ฐ๋ฅด๋ฉด, N๊ฐ์ ํ๊ณผ M๊ฐ์ ์ด๋ก ๊ตฌ์ฑ๋ ์นธ์ด ์กด์ฌํฉ๋๋ค.
1ํ 1์ด๋ถํฐ ๋ธ๋ญ์ ๋์ ๋ค ๊ทธ ๋ค์ ๋น ์นธ์ ์ฐพ์ ๋ธ๋ญ์ ๋๋ ์์ผ๋ก ์งํ๋๋ค๊ฐ, ๋ง์ง๋ง์ ๋ธ๋ญ์ ๋น ์นธ ์์ด ๋ชจ๋ ์ฑ์ธ ์ ์์ผ๋ฉด ํ๋์ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ฃผํ ์ ์์ต๋๋ค.
์ฆ, ํน์ ์์น์ ํน์ ๋ธ๋ก์ ๋์ผ๋ฉด์ ์๊ธฐ๋ ๋ค์ํ ๋ถ๊ธฐ์ ์ ๋ํด ๋ชจ๋ ํ์ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋, ์ด๋ฌํ ๋ฐฉ์์ (๋ฐฑํธ๋ํน๊ณผ ๊ฐ์ ์ต์ ํ๋ฅผ ๊ฑฐ์ณ๋) N๊ณผ M์ด ์ปค์ง์๋ก ํ๋จํด์ผ ํ๋ ๋ฐฉ๋ฒ์ ์๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํฉ๋๋ค. ๋ฐ๋ผ์, ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ณ ์ํด์ผ ํฉ๋๋ค.
2. DP๋ฅผ ํตํด ์ต์ ํํ๊ธฐ
DP๋ ๋ธ๋ฃจํธ ํฌ์ค์ ์ฐ๊ด์ด ๊น์ต๋๋ค. ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ์ฌ ์ต์ ์ ํด๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ธ๋ฃจํธ ํฌ์ค์ DP ๋ชจ๋ ํด๋น๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋์ , DP๋ ํ์ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด์ ์ฌํ์ฉํ ์ ์๋ ๋ถ๋ถ์ ์ต๋ํ ์ฌํ์ฉํ์ฌ ์ฐ์ฐ ํ์๋ฅผ ์ต์ํํ๋๋ฐ์, ์ด๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ (Memoization)์ด๋ผ๊ณ ํฉ๋๋ค.
์ด ๋ฌธ์ ๋ํ DP๋ก ์ฐ์ฐ ํ์๋ฅผ ์ต์ํํ ์ ์์ต๋๋ค. ์ด๋ป๊ฒ ์ต์ ํ๋ฅผ ํ ์ ์์๊น์?
ํน์ ๋ฌธ์ ๋ฅผ DP๋ก ์ ๊ทผํ๊ธฐ ์ํด์๋, ์์์ ์์น์ ๋ํด ์ ํ์์ ์ธ์ธ ์ ์์ด์ผ ํฉ๋๋ค.
3. ์ ํ์์ ๋น๋กฏํ ์ผ๋ฐ์ ์ธ ๊ท์น ์ฐพ๊ธฐ
๋ธ๋ฃจํธ ํฌ์ค๋ก ์ ๊ทผํ ๋๋ฅผ ๋ ์ฌ๋ ค๋ด ์๋ค. ํน์ ์์น์ ํน์ ๋ธ๋ก์ ๋๋ ๊ฒฝ์ฐ,
์ด์ ์ ํ์ ์นธ์ ์๊ฐํ์ง ์๊ณ ๊ทธ ๋ค์ ์นธ๋ค์ ๋ํด ๋ฐฉ๋ฒ์ ์๋ฅผ ๋ฐ์ง๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ด๋, dp[n][m][?] = (ํน์ ์์น์์ ํน์ ๋ธ๋ก์ ๋์ ๊ฒฝ์ฐ ์๊ธฐ๋ ๋ฐฉ๋ฒ์ ์)๋ก ์ ํ์์ ๋ํ๋ผ ์ ์์ ๊ฒ์ ๋๋ค.
n๊ณผ m์ ํน์ ์์น๋ฅผ ๋ํ๋ ๋๋ค.
์ฌ๊ธฐ์ ?๋ ๋ฌด์์ ๋ํ๋ด์ผ ํ ๊น์?
ํน์ ๋ธ๋ก์ ๋์ ๋, ๋ธ๋ญ์ (๋น ์นธ์ ํฌํจํ์ฌ) ํญ์ 2x2์นธ์ ์ฐจ์งํ๋ฏ๋ก ๊ทธ ์๋ ํ์'๋' ์ํฅ์ ๋ผ์น๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋, ํน์ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ๋ก ์๋ ํ์'๋ง' ์ํฅ์ ๋ผ์น๊ฒ ๋๋ฏ๋ก k์ ๋ฒ์๋ฅผ (ํ์ฌ ์์น) ~ (์ํฅ์ด ๋ผ์น๋ ์์น)๋ก ์ขํ ์ ์์ต๋๋ค.
์ฆ, ํ์ฌ ์์น๋ฅผ 0๋ฒ์งธ๋ผ ํ๋ฉด ์ด๋ค ๋ธ๋ก์ ๋์๋ M + 1๋ฒ์งธ ์์น๊น์ง๋ง ์ํฅ์ ๋ผ์น ์๋ฐ์ ์์ต๋๋ค.
๋ฐ๋ผ์, Bitmasking์ ํ์ฉํ์ฌ ํด๋น ๋ฒ์์ ์กด์ฌํ ์ ์๋ ๋ธ๋ญ์ ๋ชจ๋ ํจํด๋ฅผ ?๋ก ์ ํ๋ฉด ๋ฉ๋๋ค.
4. Top-Down Bitfield DP๋ก ๊ตฌํ๊ธฐ
์์ ๊ณผ์ ์ ํตํด, ์ ํ์์
dp[n][m][k] = (ํน์ ์์น์์ ํน์ ๋ธ๋ก์ ๋์ ๊ฒฝ์ฐ ์๊ธฐ๋ ๋ฐฉ๋ฒ์ ์) ๋ก ๋ํ๋ผ ์ ์์ต๋๋ค.
(n, m์ ํน์ ์์น, k๋ ํด๋น ๋ฒ์์ ์กด์ฌํ ์ ์๋ ๋ธ๋ญ์ ํจํด)
k๋ 2 ^ (M + 2) ์ด๋ฏ๋ก, ์๊ฐ ๋ณต์ก๋๋ O(NM2^(M + 2)) ๊ฐ ๋ฉ๋๋ค.
์๋์ ์ฝ๋๋ฅผ ํตํด ์ ํ์์ ๋ํ ํ์ด ๊ณผ์ ์ ํ์ธํ์ธ์.
์ฝ๋
โ ๏ธ Python ์ธ์ด ํน์ฑ์ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์, ์ด ์ฝ๋๋ก ์ ์ถํ ๊ฒฝ์ฐ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์, ๋ฏธ๋ฆฌ ๋ชจ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฝ์๋๊ณ ์ธ๋ฑ์ฑํ๋ ๋ฐฉ์์ผ๋ก ํ์ด์ผ ํฉ๋๋ค.